/*! \file FactoryDistribution.hpp
    \brief Une factory qui permet d'instancier des distribution statistiques d'allocations.
    Details.
*/

#ifndef __FACTORY_DISTRIBUTION__
#define __FACTORY_DISTRIBUTION__


#include "DefaultAllocDistribution.hpp"
#include "LinearAllocDistribution.hpp"
#include "GaussianAllocDistribution.hpp"
#include "UniformeAllocDistribution.hpp"
#include "SourceBinaire.hpp"

/**
 *\brief Une factory permettant de generer des distributions.
 *\class FactoryDistribution 
 * Cette classe permet d'instancier les distribution, 
 * ainsi si on souhaite ajouter une classe distribution il suffira d'ajouter une
 * methode statique dans cette factory.
 */
class FactoryDistribution
{
public:
  /**
   *\brief Fournit une instance d'une distribution par defaut. 
   */ 
  static DefaultAllocDistribution* getDistribution();
  static DefaultAllocDistribution* getDistribution(size_t size);
  
  
  /**
   *\brief Fournit une instance d'une distribution lineaire.
   * Les allocation suivent une droite, par exemple
   * alloc(2),alloc(4),alloc(6),alloc(8),.....alloc(2*t) pour t dans {1,2,3,....}
   */ 
  static LinearAllocDistribution * getDistributionLinearAlloc();

  /**
   *\brief Fournit une instance d'une distribution gaussienne en terme de duree de vie des blocs. 
   */ 
  static GaussianAllocDistribution* getDistributionGaussianAlloc();
  
  /**
   *\brief Fournit une instance d'une distribution des allocation uniforme en taille et en duree de vie.
   * Les blocs vivent avec une duree tiree aleatoirement dans
   * {1,2,3,4,5,6,7,....ordre} a un facteur multiplication pres. De meme pour la
   * taille qui est tiree aletoirement dans {2,4,8,16,32,64,....,2 puissance
   * ordre}
   */ 
  static UniformeAllocDistribution* getDistributionUniformeAlloc(int ordre);
  
  
  /**
   *\brief Fournit une instance d'une source binaire aleatoire de parametre p.
   * Cette source binaire est utile pour decider d'ecrire ou non dans un bloc, typiquement une forte valeur de p
   * va permettre d'accroitre les defauts de pages initiaux et va faire
   * accroitre la taille du RSS.
   */ 
  static Bernouillie* getSourceBinaireBernouillie(float p);
  
};
#endif
